﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using ModeloGaleriaNET;
using CADs;
using AvalonDock;
using System.ComponentModel;
using SeguridadGaleria;

namespace GaleriaNET
{
    /// <summary>
    /// Lógica de interacción para ucUserData.xaml
    /// </summary>
    public partial class ucUserData : UserControl
    {
        private string[] permisos = new string[] {TiposRoles.CREAR_USUARIO, TiposRoles.MODIFICAR_DATOS_USUARIO_PROPIO,
        TiposRoles.MODIFICAR_DATOS_OTRO_USUARIO, TiposRoles.ELIMINAR_USUARIO, TiposRoles.CAMBIAR_CONTRASENYA_USUARIO};
        private string originalDni;
        private string originalNombre;
        private string originalAp1;
        private string originalAp2;
        private string originalNombreUsu;
        private string originalPass;
        private int originalRol;
        private bool success;
        private bool loaded;
        private Brush brushNormal;
        private Usuario usuario;
        private UsuarioCAD uCAD;
        private readonly string title;
        private Dictionary<string, bool> permisosDatos;
        private BackgroundWorker worker;
        private IAuditoria auditoria;

        public ucUserData()
        {
            InitializeComponent();
            loaded = false;
            usuario = null;
            lbTitulo.Content = title = "Creación de nuevo usuario";
            worker = new BackgroundWorker();
            worker.DoWork += worker_DoWork;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            auditoria = new AuditoriaBD();
        }

        public ucUserData(Usuario u)
        {
            InitializeComponent();
            loaded = false;
            usuario = u;
            lbTitulo.Content = title = "Datos de " + usuario.Nombre + " " + usuario.Apellido1;
            worker = new BackgroundWorker();
            worker.DoWork += worker_DoWork;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            auditoria = new AuditoriaBD();
        }

        public UsuarioCAD UsuarioCAD
        {
            get { return uCAD == null ? new UsuarioCAD() : uCAD; }
            set { uCAD = value; }
        }

        public string Title
        {
            get { return title; }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            if (!loaded)
            {
                brushNormal = tbDNI.BorderBrush;
                tbDNI.Focus();
                if (usuario != null)
                {
                    gridBotones.Visibility = Visibility.Hidden;
                    pbPassword2.IsEnabled = pbPassword.IsEnabled = tbNombreUsuario.IsEnabled =
                        tbNombre.IsEnabled = tbDNI.IsEnabled = tbPrimerApellido.IsEnabled =
                        tbSegundoApellido.IsEnabled = cbRol.IsEnabled = false;

                    originalAp2 = tbSegundoApellido.Text = usuario.Apellido2;
                    originalAp1 = tbPrimerApellido.Text = usuario.Apellido1;
                    originalNombre = tbNombre.Text = usuario.Nombre;
                    originalNombreUsu = tbNombreUsuario.Text = usuario.PseudonimoLocal;
                    originalPass = string.Empty;
                    originalDni = tbDNI.Text = usuario.Dni;
                    
                    if (usuario is Administrador)
                        originalRol = cbRol.SelectedIndex = 1;
                    else
                        originalRol = cbRol.SelectedIndex = 0;

                    if (!(GetContainerWindow().Usuario is Administrador) || usuario == GetContainerWindow().Usuario)
                        btBorrar.Visibility = Visibility.Hidden;

                    if (usuario == GetContainerWindow().Usuario)
                        cbRol.IsEnabled = false;
                }
                else
                {
                    gridBtEditar.Visibility = Visibility.Hidden;
                    btBorrar.Visibility = Visibility.Hidden;
                    originalAp1 = originalAp2 = originalDni = originalNombre = originalNombreUsu =
                        originalPass = string.Empty;
                    originalRol = -1;
                }

                if (!worker.IsBusy)
                    worker.RunWorkerAsync();

                success = false;
                loaded = true;
            }
        }

        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            bool? value;
            string usu;

            usu = Convert.ToString(Utilities.FindUsuarioData(typeof(UserWindow), this, "Name"));
            permisosDatos = new Dictionary<string, bool>();
            foreach (string s in permisos)
            {
                value = ManejadorRoles.Instance.CanUse(s, usu);
                if (value != null)
                    permisosDatos.Add(s, value.Value);
            }
        }

        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            bool value, value2, value3, value4;
            string usu;

            if (permisosDatos == null || permisosDatos.Count != permisos.Length)
            {
                Xceed.Wpf.Toolkit.MessageBox.Show("No se han podido obtener los permisos", "Error",
                    MessageBoxButton.OK, MessageBoxImage.Error);
                btBorrar.IsEnabled = btEditar.IsEnabled = btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled = 
                pbPassword2.IsEnabled = cbRol.IsEnabled = false;
            }
            else
            {
                if (usuario == null) // Solo crear
                {
                    permisosDatos.TryGetValue(TiposRoles.CREAR_USUARIO, out value);
                    if (value == false)
                    {
                        btBorrar.IsEnabled = btEditar.IsEnabled = btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                            tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled =
                            pbPassword2.IsEnabled = cbRol.IsEnabled = false;
                    }
                }
                else // Modificar y borrar
                {
                    permisosDatos.TryGetValue(TiposRoles.MODIFICAR_DATOS_OTRO_USUARIO, out value);
                    permisosDatos.TryGetValue(TiposRoles.ELIMINAR_USUARIO, out value2);
                    permisosDatos.TryGetValue(TiposRoles.MODIFICAR_DATOS_USUARIO_PROPIO, out value3);
                    permisosDatos.TryGetValue(TiposRoles.CAMBIAR_CONTRASENYA_USUARIO, out value4);

                    if (value2 == false && value == false && value3 == false && value4 == false)
                    {
                        btBorrar.IsEnabled = btEditar.IsEnabled = btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                             tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled =
                             pbPassword2.IsEnabled = cbRol.IsEnabled = false;
                    }
                    else
                    {
                        if (value == false && value3 == false && value4 == false) // No se pueden modificar
                        {
                            btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                                tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled =
                                pbPassword2.IsEnabled = cbRol.IsEnabled = false;
                        }
                        else
                        {
                            usu = Convert.ToString(Utilities.FindUsuarioData(typeof(UserWindow), this, "Name"));

                            // Modificar tus datos
                            if (usuario.PseudonimoLocal.Equals(usu))
                            {
                                if (!value3 && value4)
                                {
                                    btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                                tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled =
                                pbPassword2.IsEnabled = cbRol.IsEnabled = false;
                                }
                            }
                            else  // Modificar datos de otro
                            {
                                if (!(value && value4))
                                {
                                    btGuardar.IsEnabled = tbDNI.IsEnabled = tbNombre.IsEnabled =
                                        tbPrimerApellido.IsEnabled = tbSegundoApellido.IsEnabled = tbNombreUsuario.IsEnabled = pbPassword.IsEnabled =
                                        pbPassword2.IsEnabled = cbRol.IsEnabled = false;
                                }
                            }
                               
                            // Eliminar usuario
                            if (!value2)
                                btBorrar.IsEnabled = false;
                        }
                        if (value2 == false)
                            btBorrar.IsEnabled = false;
                    }
                }
            }
            _busyIndicator.IsBusy = false;
        }

        public void AddEventHandler()
        {
            ((DocumentContent)this.Parent).Closing += ClosingDocument;
        }

        private void ClosingDocument(object sender, CancelEventArgs e)
        {
            if (!success)
            {
                if (HasChanges())
                {
                    if (Xceed.Wpf.Toolkit.MessageBox.Show("¿Desea salir sin aplicar los cambios?", "Salir",
                        MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.No)
                        e.Cancel = true;
                }
            }
        }

        private void btCancelar_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void btBorrar_Click(object sender, RoutedEventArgs e)
        {
            ucAdmin admin;
            DocumentContent padre;
            int uId;

            if (Xceed.Wpf.Toolkit.MessageBox.Show("¿Está seguro de que desea borrar este usuario?\nEsta acción no se puede deshacer",
                    "Borrar usuario", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                uId = Convert.ToInt32(Utilities.FindUsuarioData(typeof(UserWindow), this, "Id"));
                success = UsuarioCAD.BorrarUsuario(usuario);
                if (success)
                {
                    auditoria.Mensaje(new object[] { usuario.Id }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.BORRAR_USUARIO),
                        uId);
                    System.Threading.Thread.Sleep(1000);
                    Xceed.Wpf.Toolkit.MessageBox.Show("Usuario borrado con éxito",
                        "Usuario borrado", MessageBoxButton.OK, MessageBoxImage.Information);
                    if ((padre = (DocumentContent)(FindDocumentContent(typeof(ucAdmin)))) != null)
                    {
                        admin = (ucAdmin)(padre.Content);
                        admin.ActualizarDataGrid();
                        Close();
                    }
                }
                else
                {
                    auditoria.Mensaje(new object[] { usuario.Id }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_BORRAR_USUARIO),
                        uId);
                    System.Threading.Thread.Sleep(1000);
                    Xceed.Wpf.Toolkit.MessageBox.Show("No se ha podido borrar el usuario",
                        "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

            }
            else
                return;
        }

        private void Close()
        {
            ((DocumentContent)this.Parent).Close();
        }

        private DocumentContent FindDocumentContent(Type t)
        {
            DockingManager manager;

            manager = ((DocumentContent)this.Parent).Manager;
            // Buscamos si hay abierta una instancia del documento a abrir
            foreach (AvalonDock.DocumentContent doc in manager.Documents)
            {
                if (doc.Content.GetType() == t)
                    return doc;
            }
            return null;
        }

        private void btGuardar_Click(object sender, RoutedEventArgs e)
        {
            Usuario u = null;
            ucAdmin admin;
            DocumentContent padre;
            int uId;
            List<string> camposModificados;
            string group;

            uId = Convert.ToInt32(Utilities.FindUsuarioData(typeof(UserWindow), this, "Id"));
            // Modificar usuario
            if (usuario != null)
            {
                if (HasChanges())
                {
                    if (AreCamposCorrectos()) // Los campos son correctos
                    {
                        camposModificados = new List<string>();
                        if (usuario.PseudonimoLocal.Equals(tbNombreUsuario.Text) == false)
                            camposModificados.Add("nombre de usuario");
                        if (usuario.Nombre.Equals(tbNombre.Text) == false)
                            camposModificados.Add("nombre");
                        if (usuario.Apellido1.Equals(tbPrimerApellido.Text) == false)
                            camposModificados.Add("primer apellido");
                        if (usuario.Apellido2.Equals(tbSegundoApellido.Text) == false)
                            camposModificados.Add("segundo apellido");
                        if (!string.IsNullOrWhiteSpace(pbPassword.Password))
                            camposModificados.Add("contraseña");
                        if (usuario.Dni.Equals(tbDNI.Text) == false)
                            camposModificados.Add("dni");

                        if (originalRol != cbRol.SelectedIndex)
                            camposModificados.Add("rol");

                        usuario.PseudonimoLocal = tbNombreUsuario.Text;
                        usuario.Nombre = tbNombre.Text;
                        usuario.Apellido1 = tbPrimerApellido.Text;
                        usuario.Apellido2 = tbSegundoApellido.Text;
                        if (!string.IsNullOrWhiteSpace(pbPassword.Password))
                            usuario.Password = Utilities.EncriptarSHA1(pbPassword.Password);
                        usuario.Dni = tbDNI.Text;

                        // Guardar cambios
                        if ((success = UsuarioCAD.GuardarCambios(usuario.Id, originalRol, cbRol.SelectedIndex)))
                        {
                            if (camposModificados.Contains("rol"))
                            {
                                if (originalRol != cbRol.SelectedIndex)
                                {
                                    // De usuario a administrador
                                    if (cbRol.SelectedIndex == 1)
                                    {
                                        auditoria.Mensaje(new object[] { usuario.Id },
                                            TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ORDENAR_ADMINISTRADOR), uId);
                                        System.Threading.Thread.Sleep(1000);
                                    }
                                    // De administrador a usuario
                                    else if (cbRol.SelectedIndex == 0)
                                    {
                                        auditoria.Mensaje(new object[] { usuario.Id },
                                            TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.DESORDENAR_ADMINISTRADOR), uId);
                                        System.Threading.Thread.Sleep(1000);
                                    }
                                }
                            }

                            if (usuario.Id == GetContainerWindow().Usuario.Id)
                            {
                                GetContainerWindow().ModificarUsuario(usuario);
                                auditoria.Mensaje(new object[] { Utilities.ListToString(camposModificados, ", ") }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.MODIFICAR_DATOS_USUARIO_PROPIO), uId);
                                System.Threading.Thread.Sleep(1000);
                            }
                            else
                            {
                                auditoria.Mensaje(new object[] { Utilities.ListToString(camposModificados, ", ") }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.MODIFICAR_DATOS_USUARIO), uId);
                                System.Threading.Thread.Sleep(1000);
                            }

                            Xceed.Wpf.Toolkit.MessageBox.Show("Usuario modificado con éxito",
                                    "Usuario modificado", MessageBoxButton.OK, MessageBoxImage.Information);
                            if ((padre = (DocumentContent)(FindDocumentContent(typeof(ucAdmin)))) != null)
                            {
                                admin = (ucAdmin)(padre.Content);
                                admin.ActualizarDataGrid();
                            }
                            Close();
                        }
                        else
                        {
                            if (usuario.Id == GetContainerWindow().Usuario.Id)
                            {
                                auditoria.Mensaje(new object[] { Utilities.ListToString(camposModificados, ", ") }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_MODIFICAR_DATOS_USUARIO_PROPIO), uId);
                                System.Threading.Thread.Sleep(1000);
                            }
                            else
                            {
                                auditoria.Mensaje(new object[] { Utilities.ListToString(camposModificados, ", ") }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_MODIFICAR_DATOS_USUARIO), uId);
                                System.Threading.Thread.Sleep(1000);
                            }
                            Xceed.Wpf.Toolkit.MessageBox.Show("No se ha podido modificar el usuario",
                                "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                    }
                }
                else
                {
                    Xceed.Wpf.Toolkit.MessageBox.Show("No se ha realizado ningún cambio",
                        "Salir sin cambios", MessageBoxButton.OK, MessageBoxImage.Information);
                    Close();
                }
            }
            // Nuevo usuario
            else
            {
                if (AreCamposCorrectos())
                {
                    u = cbRol.SelectedIndex == 0 ? new Usuario() : new Administrador();
                    u.PseudonimoLocal = tbNombreUsuario.Text;
                    u.Nombre = tbNombre.Text;
                    u.Apellido1 = tbPrimerApellido.Text;
                    u.Apellido2 = tbSegundoApellido.Text;
                    u.Dni = tbDNI.Text;
                    u.Password = Utilities.EncriptarSHA1(pbPassword.Password);
                    u.Activo = true;

                    if (u is Administrador)
                    {
                        success = UsuarioCAD.GuardarNuevoUsuario((Administrador)u);
                        group = "Administradores";
                    }
                    else
                    {
                        success = UsuarioCAD.GuardarNuevoUsuario(u);
                        group = "Usuarios";
                    }

                    if (success)
                    {
                        auditoria.Mensaje(new object[] { u.Id },
                            TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.INICIO_CREAR_USUARIO_ROLES), uId);
                        System.Threading.Thread.Sleep(1000);

                        if (ManejadorRoles.Instance.CreateUser(u.PseudonimoLocal, group))
                            auditoria.Mensaje(new object[] { u.Id },
                                TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.CREAR_USUARIO_ROLES), uId);
                        else
                            auditoria.Mensaje(new object[] { u.Id },
                            TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_CREAR_USUARIO_ROLES), uId);

                        System.Threading.Thread.Sleep(1000);
                        auditoria.Mensaje(new object[] { u.Id }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.CREAR_USUARIO), uId);
                        System.Threading.Thread.Sleep(1000);
                        Xceed.Wpf.Toolkit.MessageBox.Show("Usuario creado con éxito", "Usuario creado",
                                MessageBoxButton.OK, MessageBoxImage.Information);
                        if ((padre = (DocumentContent)(FindDocumentContent(typeof(ucAdmin)))) != null)
                        {
                            admin = (ucAdmin)(padre.Content);
                            admin.ActualizarDataGrid();
                            Close();
                        }
                    }
                    else
                    {
                        auditoria.Mensaje(new object[] { u.Id }, TiposAuditoria.Ordinal(TiposAuditoria.TIPO_AUDITORIA.ERROR_CREAR_USUARIO), uId);
                        System.Threading.Thread.Sleep(1000);
                        Xceed.Wpf.Toolkit.MessageBox.Show("No ha sido posible realizar la inserción del nuevo usuario",
                            "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }
                }
            }
        }

        private bool AreCamposCorrectos()
        {
            bool salida = true;
            // Vemos si los campos están rellenos y marcamos con rojo aquellos que no lo estén
            if (string.IsNullOrWhiteSpace(tbNombre.Text) || string.IsNullOrWhiteSpace(tbDNI.Text) || string.IsNullOrWhiteSpace(tbPrimerApellido.Text)
                || string.IsNullOrWhiteSpace(tbSegundoApellido.Text) || string.IsNullOrWhiteSpace(tbNombreUsuario.Text) 
                || (usuario == null && string.IsNullOrWhiteSpace(pbPassword.Password))
                || (usuario == null && string.IsNullOrWhiteSpace(pbPassword2.Password)) 
                || cbRol.SelectedIndex == -1)
            {
                ToolTip t = new ToolTip();
                t.Content = "Este campo no puede estar vacío";

                if (string.IsNullOrWhiteSpace(tbNombre.Text))
                {
                    tbNombre.BorderBrush = new SolidColorBrush(Colors.Red);
                    tbNombre.ToolTip = t;
                }
                if (string.IsNullOrWhiteSpace(tbDNI.Text))
                {
                    tbDNI.BorderBrush = new SolidColorBrush(Colors.Red);
                    tbDNI.ToolTip = t;
                }
                if (string.IsNullOrWhiteSpace(tbPrimerApellido.Text))
                {
                    tbPrimerApellido.BorderBrush = new SolidColorBrush(Colors.Red);
                    tbPrimerApellido.ToolTip = t;
                }
                if (string.IsNullOrWhiteSpace(tbSegundoApellido.Text))
                {
                    tbSegundoApellido.BorderBrush = new SolidColorBrush(Colors.Red);
                    tbSegundoApellido.ToolTip = t;
                }
                if (string.IsNullOrWhiteSpace(tbNombreUsuario.Text))
                {
                    tbNombreUsuario.BorderBrush = new SolidColorBrush(Colors.Red);
                    tbNombreUsuario.ToolTip = t;
                }
                if (usuario == null && string.IsNullOrWhiteSpace(pbPassword.Password))
                {
                    pbPassword.BorderBrush = new SolidColorBrush(Colors.Red);
                    pbPassword.ToolTip = t;
                }
                if (usuario == null && string.IsNullOrWhiteSpace(pbPassword2.Password))
                {
                    pbPassword2.BorderBrush = new SolidColorBrush(Colors.Red);
                    pbPassword2.ToolTip = t;
                }
                if (cbRol.SelectedIndex == -1)
                {
                    cbRol.BorderBrush = new SolidColorBrush(Colors.Red);
                    cbRol.ToolTip = t;
                }
                salida = false;
            }
            else
            {
                // Validamos el formato del DNI
                if (usuario == null || (usuario != null && !originalDni.Equals(tbDNI.Text)))
                {
                    if (!ModeloGaleriaNET.Validacion.NIF(tbDNI.Text))
                    {
                        ToolTip t = new ToolTip();
                        t.Content = "DNI incorrecto";
                        tbDNI.BorderBrush = new SolidColorBrush(Colors.Red);
                        tbDNI.ToolTip = t;
                        salida = false;
                    }
                }

                if (usuario == null)
                {
                    // Password entre 6 y 16 caracteres alfanuméricos mezclados
                    if (!ModeloGaleriaNET.Validacion.Password(pbPassword.Password))
                    {
                        ToolTip t = new ToolTip();
                        t.Content = "La contraseña debe contener entre 6 y 16 caraceteres numéricos, mayúsculas y minúsculas";
                        pbPassword.BorderBrush = new SolidColorBrush(Colors.Red);
                        pbPassword2.BorderBrush = new SolidColorBrush(Colors.Red);
                        pbPassword.ToolTip = pbPassword2.ToolTip = t;
                        salida = false;
                    }
                    // Si los campos están rellenos, comprobamos que las contraseñas sean iguales
                    else if (!pbPassword.Password.Equals(pbPassword2.Password))
                    {
                        ToolTip t = new ToolTip();
                        t.Content = "Las contraseñas deben ser iguales";
                        pbPassword.BorderBrush = new SolidColorBrush(Colors.Red);
                        pbPassword2.BorderBrush = new SolidColorBrush(Colors.Red);
                        pbPassword.ToolTip = pbPassword2.ToolTip = t;
                        salida = false;
                    }
                }
                else
                {
                    if (!(string.IsNullOrWhiteSpace(pbPassword.Password) && string.IsNullOrWhiteSpace(pbPassword2.Password)))
                    {
                        // Password entre 6 y 16 caracteres alfanuméricos mezclados
                        if (!ModeloGaleriaNET.Validacion.Password(pbPassword.Password))
                        {
                            ToolTip t = new ToolTip();
                            t.Content = "La contraseña debe contener entre 6 y 16 caraceteres numéricos, mayúsculas y minúsculas";
                            pbPassword.BorderBrush = new SolidColorBrush(Colors.Red);
                            pbPassword2.BorderBrush = new SolidColorBrush(Colors.Red);
                            pbPassword2.ToolTip = pbPassword.ToolTip = t;
                            salida = false;
                        }
                        // Si los campos están rellenos, comprobamos que las contraseñas sean iguales
                        else if (!pbPassword.Password.Equals(pbPassword2.Password))
                        {
                            ToolTip t = new ToolTip();
                            t.Content = "Las contraseñas deben ser iguales";
                            pbPassword.BorderBrush = new SolidColorBrush(Colors.Red);
                            pbPassword2.BorderBrush = new SolidColorBrush(Colors.Red);
                            pbPassword2.ToolTip = pbPassword.ToolTip = t;
                            salida = false;
                        }
                    }
                }

                if (usuario == null || (usuario != null && !originalDni.Equals(tbDNI.Text)))
                {
                    // Si las contraseñas son iguales, miramos el DNI sea correcto y que no exista
                    if (UsuarioCAD.GetUsuarioByDNI(tbDNI.Text) != null)
                    {
                        ToolTip t = new ToolTip();
                        t.Content = "El DNI ya existe en la aplicación";
                        tbDNI.BorderBrush = new SolidColorBrush(Colors.Red);
                        tbDNI.ToolTip = t;
                        salida = false;
                    }
                }

                // Y si no existe el DNI, mira el nombre de usuario
                if (usuario == null || (usuario != null && !originalNombreUsu.Equals(tbNombreUsuario.Text)))
                {
                    if (UsuarioCAD.GetUsuarioByNombreUsuario(tbNombreUsuario.Text) != null)
                    {
                        ToolTip t = new ToolTip();
                        t.Content = "El nombre de usuario ya existe en la aplicación";
                        tbNombreUsuario.BorderBrush = new SolidColorBrush(Colors.Red);
                        tbNombreUsuario.ToolTip = t;
                        salida = false;
                    }
                }
            }

            // Si llega aquí es que todo está correcto y devuelve true
            return salida;
        }

        private void cbRol_GotFocus(object sender, RoutedEventArgs e)
        {
            tbNombre.BorderBrush = brushNormal;
            tbDNI.BorderBrush = brushNormal;
            tbPrimerApellido.BorderBrush = brushNormal;
            tbSegundoApellido.BorderBrush = brushNormal;
            tbNombreUsuario.BorderBrush = brushNormal;
            pbPassword.BorderBrush = brushNormal;
            pbPassword2.BorderBrush = brushNormal;
            cbRol.BorderBrush = brushNormal;
            tbDNI.ToolTip = tbNombre.ToolTip = tbPrimerApellido.ToolTip = tbSegundoApellido.ToolTip =
                tbNombreUsuario.ToolTip = pbPassword.ToolTip = pbPassword2.ToolTip = cbRol.ToolTip = null;
        }

        private UserWindow GetContainerWindow()
        {
            DockingManager manager;
            manager = ((DocumentContent)(this.Parent)).Manager;
            return (UserWindow)(((Grid)(manager.Parent)).Parent);
        }

        private bool HasChanges()
        {
            if (!originalPass.Equals(pbPassword.Password) || !originalNombreUsu.Equals(tbNombreUsuario.Text)
                || !originalNombre.Equals(tbNombre.Text) || !originalDni.Equals(tbDNI.Text) ||
                !originalAp2.Equals(tbSegundoApellido.Text) || !originalAp1.Equals(tbPrimerApellido.Text)
                || originalRol != cbRol.SelectedIndex)
                return true;

            return false;
        }

        private void btEditar_Click(object sender, RoutedEventArgs e)
        {
            gridBtEditar.Visibility = Visibility.Hidden;
            gridBotones.Visibility = Visibility.Visible;
            pbPassword2.IsEnabled = pbPassword.IsEnabled = tbNombreUsuario.IsEnabled =
                tbNombre.IsEnabled = tbDNI.IsEnabled = tbPrimerApellido.IsEnabled =
                tbSegundoApellido.IsEnabled = true;

            if (usuario == GetContainerWindow().Usuario)
                cbRol.IsEnabled = false;
            else
                cbRol.IsEnabled = true;
        }
    }
}
